Пульт.Онлайн /

Резервирование сервера

Назначение механизма резервирования
Быстрый старт
Как работает резервирование
Проблема Split brain
Внешнее управление переключением
Требования к серверам и сети
Что копируется на Резерв
Процедуры обслуживания и переключения
Диагностика и устранение неполадок


Назначение механизма резервирования

Механизм рассчитан на один сценарий: быстро восстановить работу системы, когда основной сервер полностью вышел из строя. Это отказ оборудования или дисков, потеря площадки, пожар. Резервный сервер заранее держит копию данных и настроек основного. Когда основной пропадает, резервный сервер сам запускает сервисы, и система продолжает работать на нём через заданное время. Восстанавливать систему из архива и настраивать её вручную не нужно.

Далее основной сервер называется Основной, резервный — Резерв. Механизм состоит из двух сервисов:

  • backupserver работает на Основном и отдаёт данные по запросу Резерва;
  • backupclient работает на Резерве: забирает данные и решает, когда запускать систему.

Включение backupserver безопасно для Основного. Сервис только читает данные и ничего на Основном не меняет: команд записи у него нет. Временные копии больших файлов он хранит в своём каталоге services/backupserver/temp. Единственное влияние на Основной — нагрузка на диск и процессор при чтении файлов во время синхронизации.

Механизм рассчитан на случай полного отказа Основного сервера. Резерв считает Основной вышедшим из строя, если нет связи с сервисом backupserver. Отличить отказ самого Основного от потери связи между серверами Резерв не может. Поэтому при частичных сбоях Резерв может запуститься, даже если Основной продолжает работать. К таким ситуациям относятся обрыв связи, остановка только backupserver или перезагрузка Основного дольше окна переключения. В результате может возникнуть split brain — одновременная работа обоих серверов. Если решение о переключении может принимать внешняя система, например с арбитром, используйте внешнее управление.


Быстрый старт

Перед включением
Включение на Основном
Включение на Резерве
Проверка
Отключение резервирования

Команды управления системой выполняются из каталога установки, обычно /pult_server. Подробнее — в разделе документации «Управление сервисами».

Команда Действие
./start запустить сервисы
./start -<сервис> запустить все сервисы, кроме указанного
./stop all остановить все сервисы
./stop -<сервис> остановить все сервисы, кроме указанного

Настройки каждого сервиса хранятся в файле services/<сервис>/config.cfg.

Перед включением

  • На Резерве установлена система той же версии, для той же архитектуры процессора и ОС, в каталог с тем же путём.
  • С Резерва доступен порт backupserver на Основном (по умолчанию TCP 11317).
  • Решено, как пользователи попадут на Резерв после переключения: Резерв не забирает себе IP-адрес Основного (см. «Требования к системе»).
  • Окно переключения больше времени перезагрузки Основного (см. «Окно переключения»).

Включение на Основном

  1. В services/backupserver/config.cfg задайте secret — длинную случайную строку — и enabled=1.
  2. Запустите сервис: ./start.
  3. Проверьте лог сервиса в services/backupserver/logs. Строки после configs processed: показывают, что и как будет копироваться (см. «Диагностика»).
Параметр По умолчанию Описание
enabled 0 1 — сервис включён.
secret случайная строка Секрет, который должен предъявить Резерв. Задайте его явно. Пустое значение отключает проверку, и данные получит любой, кто подключится с разрешённого адреса. Так делать не рекомендуется.
source_dir ../.. Резервируемый каталог — каталог установки системы (обычно /pult_server). Относительный путь отсчитывается от каталога исполняемого файла сервиса (services/backupserver); можно указать абсолютный путь.
chunk_size 1048576 Наибольший объём данных в одном ответе Резерву, байт. На медленном канале уменьшите.
allowed_ip 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 С каких адресов разрешены подключения. Список через запятую; допускаются подсети и подстановочные символы: 192.168.*.* или *.
порт сервиса 11317 Стандартный сетевой параметр сервиса. Если меняете его, укажите тот же порт в server_port на Резерве.

Включение на Резерве

  1. Убедитесь, что Основной работает и его backupserver доступен с Резерва.
  2. В services/backupclient/config.cfg задайте server_host, server_secret (то же значение, что secret на Основном), окно переключения и enabled=1. Сервис backupserver на Резерве должен быть выключен (enabled=0).
  3. Запустите сервис: ./start.
  4. Выполните проверку.
Параметр По умолчанию Описание
enabled 0 1 — сервис включён.
server_host 192.168.0.100 Адрес Основного. Он же служит ссылкой на Основной в веб-интерфейсе клиента резервирования.
server_port 11317 Порт backupserver на Основном.
server_secret XXXX… (32 символа) Секрет — тот же, что secret на Основном. Значение по умолчанию заведомо не совпадает: Резерв останется в резервном режиме, а синхронизация выполняться не будет.
server_ssl_enabled 1 TLS на соединении с Основным. Должен совпадать с настройкой backupserver.
server_checkcert 0 Проверять ли сертификат backupserver. При 0 канал зашифрован, но подлинность Основного не проверяется. Если серверы связаны не по выделенной сети, включите проверку; сертификат backupserver при этом должен её проходить.
server_timeout 10000 Таймаут связи с Основным, мс.
server_reconnect_interval 1000 Интервал между попытками подключения, мс.
server_reconnect_attempts 20 Сколько попыток подключения допускается до перехода в рабочий режим. Вместе с интервалом задаёт окно переключения. При внешнем управлении не используется.
brand_name, brand_link SCADA Пульт.Онлайн, https://pult.online Название и ссылка в веб-интерфейсе клиента резервирования.
external_control_enabled, external_control_command_file, external_control_status_file 0, ../../backupclient_command, ../../backupclient_status Внешнее управление: режим Резерва задаёт внешняя система, а не связь с Основным. См. «Внешнее управление».
backup_dir ../.. Куда копировать — каталог установки системы на Резерве (обычно /pult_server). Путь задаётся так же, как source_dir. Содержимое каталога приводится к копии Основного.
backup_period * * * * * * Как часто запускать синхронизацию. Принимает cron-строку (с точностью до секунд или до минут) либо число — интервал в секундах. По умолчанию — каждую секунду. Новый проход не начинается, пока не закончился предыдущий.

server_timeout, server_reconnect_interval и server_reconnect_attempts — не больше 65535.

Проверка

  1. Откройте лог backupclient в services/backupclient/logs на Резерве. Должны появиться строки authorization: ok, switch to sync mode, затем list loaded: … и all tasks complete.
    • authorization rejected — секреты не совпадают.
    • switch to work mode — Резерв не достучался до Основного и запустил сервисы. Исправьте связь: после её восстановления Резерв сам вернётся в резервный режим. Затем выполните действия из раздела «После split brain».
  2. Откройте в браузере адрес Резерва. Должна открыться страница «Сервер в резерве» (веб-интерфейс клиента резервирования) с процентом синхронизации и 0 ERR.
  3. Первая синхронизация может занять много времени: логи сервисов качаются в последнюю очередь.

Отключение резервирования

Отключать резервирование нужно в правильном порядке: сначала Резерв, потом Основной. Если сначала отключить backupserver, Резерв решит, что Основной пропал, и запустит сервисы.

Временно, например на время работ на Основном:

  1. На Резерве: ./stop all.
  2. Чтобы снова включить резервирование, убедитесь, что Основной работает и backupserver доступен. Затем на Резерве выполните ./start.

Насовсем:

  1. На Резерве: ./stop all, затем enabled=0 в services/backupclient/config.cfg. Система запускается автоматически при загрузке ОС. Если после этого её запустить (./start или перезагрузкой), сервисы Резерва заработают как второй Основной. Поэтому, если машина больше не нужна, удалите с неё дистрибутив.
  2. На Основном: enabled=0 в services/backupserver/config.cfg. Работающий backupserver Основному не мешает. Он перестанет запускаться после следующего перезапуска системы.

Не останавливайте на Резерве только сервис backupclient. При его остановке сервисы Резерва запускаются (см. «Переходы между режимами»).


Как работает резервирование

Режимы Резерва
Переходы между режимами
Окно переключения
Чего механизм не замечает
Веб-интерфейс клиента резервирования
Обновление системы

Резерв — полноценная установка системы. Её каталог (backup_dir) поддерживается копией каталога Основного (source_dir). backupclient приводит его к состоянию Основного, включая настройки и файлы всех сервисов, и удаляет то, чего на Основном нет. Исключения — служебные файлы, а также собственные настройки и логи backupclient и backupserver (см. «Что не копируется»).

Режимы Резерва

Резервный режим — Резерв пассивен:

  1. backupclient кладёт в каталог каждого сервиса файл-флаг reserve.tmp. Сервисы переходят в режим ожидания.
  2. backupclient ждёт, пока остановятся все сервисы, кроме supervisor и его самого. Работающий сервис отмечается файлом running.tmp.
  3. На портах веб-интерфейса системы открывается веб-интерфейс клиента резервирования (см. ниже).
  4. Если Основной принял секрет, по расписанию backup_period выполняется синхронизация.

Рабочий режим — Резерв работает вместо Основного:

  1. backupclient удаляет флаги reserve.tmp, и сервисы запускаются.
  2. Веб-интерфейс клиента резервирования закрывается и освобождает порты для веб-интерфейса системы.
  3. backupclient продолжает попытки подключиться к Основному.

Переходы между режимами

По умолчанию режим выбирает сам backupclient по связи с Основным — это автоматическое управление, его описывает таблица ниже. При внешнем управлении режим задаёт внешняя система, и из таблицы действует только последняя строка.

Событие Результат
backupserver Основного принял секрет резервный режим, идёт синхронизация
backupserver Основного отказал по секрету резервный режим, синхронизация не выполняется («Клиент не авторизован!»). Повторной попытки нет до перезапуска одного из сервисов
Соединение есть, но авторизация не прошла по другой причине: таймаут, на порту не backupserver, временная блокировка после неверных секретов режим не меняется, авторизация повторяется каждые 30 с
Нет связи server_reconnect_attempts попыток подряд рабочий режим
В рабочем режиме backupserver Основного снова ответил резервный режим: сервисы Резерва останавливаются, копия приводится к состоянию Основного
Сервис backupclient остановлен, в том числе для перезапуска флаги reserve.tmp снимаются, сервисы Резерва запускаются

Любой ответ backupserver, даже отказ, считается признаком того, что Основной жив: два работающих сервера хуже временного отсутствия резервной копии. Поэтому Резерв с неверным секретом остаётся в резервном режиме, но не синхронизируется. За этим состоянием нужно следить.

При автоматическом управлении флаги reserve.tmp выставляются только после ответа Основного на авторизацию. При каждом запуске backupclient, в том числе после перезапуска, сервисы Резерва до этого ответа не удерживаются и могут ненадолго запуститься. Если при запуске Резерва Основной недоступен, Резерв перейдёт в рабочий режим примерно через (server_reconnect_attempts + 1) × server_reconnect_interval. Запускайте Резерв, только убедившись, что Основной работает и доступен. При внешнем управлении флаги выставляются сразу при запуске (см. «Отличия от автоматического управления»).

Окно переключения

Отсчёт начинается, когда backupclient обнаружил потерю связи. Если сервис backupserver или ОС Основного останавливаются штатно, соединение закрывается сразу. Если хост или сеть пропали внезапно, обрыв обнаруживается по таймауту server_timeout. Затем backupclient каждые server_reconnect_interval пытается подключиться заново. После server_reconnect_attempts неудачных попыток он переходит в рабочий режим.

окно ≈ server_timeout + server_reconnect_attempts × server_reconnect_interval

По умолчанию окно составляет 20 секунд после закрытия соединения или около 30 секунд при внезапной пропаже Основного.

Окно должно быть больше самого долгого штатного перерыва связи с backupserver. Таких перерывов два:

  • Перезагрузка Основного. Отсчёт начинается в момент остановки сервисов, ещё до выключения ОС. Окно должно покрывать остановку ОС, прохождение BIOS/UEFI, загрузку ОС и запуск системы. Измерьте это время на своём оборудовании: выполните перезагрузку и засеките, когда backupserver снова станет доступен.
  • Перерывы в сети. Сюда входят перезагрузка коммутатора и перестроение сети после переключения линии. С классическим STP перестроение занимает 30–50 с.

Ориентиры: для виртуальной машины — около 1 минуты (server_reconnect_attempts = 60), для физического сервера — 3–5 минут (180–300). Минуты ожидания при полном отказе Основного сервера обходятся дешевле, чем ложное переключение при каждой перезагрузке.

При внешнем управлении окна нет: Резерв переключается только по команде.

Чего механизм не замечает

Переключение зависит только от доступности backupserver. Если хост Основного жив и backupserver отвечает, Резерв остаётся в резервном режиме, даже когда сама система на Основном не работает. Например, остановился сервис server, переполнен диск, пропала связь с объектами. В таких случаях переключайтесь вручную (см. «Ручное переключение на Резерв»).

Веб-интерфейс клиента резервирования

В резервном режиме по адресу Резерва открывается страница «Сервер в резерве». При внешнем управлении она открывается и тогда, когда первой команды ещё не было. Страница работает на тех же портах и с теми же сертификатами, что и веб-интерфейс системы, поэтому открывается только после остановки сервисов Резерва. На странице видны:

  • сообщение, что все сервисы в режиме ожидания и что они запустятся при отказе Основного; при внешнем управлении — что их запустит внешняя команда;
  • ссылка «Основной сервер», которая ведёт на веб-интерфейс Основного по адресу server_host, а также brand_name и brand_link;
  • состояние синхронизации:
Отображение Значение
12.5 MB/s \| 87% \| 3.2 GB \| 0 ERR связь есть: скорость передачи, доля синхронизированных данных, объём данных Основного, ошибки за проход
Пауза вместо скорости данные сейчас не передаются (между проходами или передавать нечего)
Клиент не авторизован! Основной отказал по секрету или авторизация ещё не прошла
Нет связи. Запуск сервисов через: N автоматическое управление: связи с Основным нет; N — оставшиеся попытки, при интервале 1 с это примерно секунды
Нет связи. Ожидание внешней команды... внешнее управление: связи с Основным нет; сервисы Резерва запустятся только по команде work
Ожидание внешней команды внешнее управление: команды ещё не было, синхронизации нет. Основной принял секрет; команда sync запустит синхронизацию, work — сервисы Резерва
Запуск сервисов внешней командой... внешнее управление: получена команда work, Резерв переходит в рабочий режим
Подключение... браузер потерял связь с самой страницей

Счётчик ошибок показывает ошибки последнего прохода. Новая ошибка видна сразу, а 0 ERR появляется только после прохода без ошибок. Разрыв связи ошибкой не считается. Подробности ошибок — только в логе backupclient: страница доступна без входа в систему, поэтому пути и тексты ошибок на ней не показываются.

Когда Резерв переходит в рабочий режим, открытая страница сама перезагрузится и покажет веб-интерфейс системы.

Если ссылка «Основной сервер» не открывается у пользователей, проверьте server_host. Возможно, серверы связаны по отдельному адресу, недоступному пользователям.

Обновление системы

Файлы системы, включая исполняемые файлы, приходят на Резерв с Основного. Поэтому обновлять достаточно Основной: при следующем проходе обновление попадёт на Резерв. Если в проходе сменился исполняемый файл, backupclient в конце прохода завершается, и supervisor запускает его уже новой версией. В момент перезапуска сервисы Резерва ненадолго получают разрешение стартовать; новый backupclient после авторизации снова переводит их в режим ожидания.

При внешнем управлении новый backupclient выполняет команду из файла команд сразу при запуске, не дожидаясь авторизации. В файле состояния на время перезапуска появляется stopped, затем switching и sync.


Проблема Split brain

Split brain — состояние, когда работают оба сервера. Оно наступает, если Резерв перестал видеть backupserver, а Основной продолжает работать. Причины:

  • обрыв связи между серверами: сеть, межсетевой экран, VPN;
  • остановка или сбой одного сервиса backupserver на Основном;
  • перезагрузка или обслуживание Основного дольше окна переключения;
  • запуск Резерва, когда Основной для него недоступен;
  • ошибка настройки связи: адрес, порт, TLS, allowed_ip, проверка сертификата.

При внешнем управлении Резерв сам не переключается: split brain возникает, только если внешняя система даст команду work при работающем Основном.

Пока длится split brain:

  • оба сервера опрашивают оборудование и записывают данные, оба могут отправлять команды управления;
  • оповещения могут приходить дважды;
  • пользователи работают с тем сервером, на чей адрес зашли. Изменения на одном сервере не видны на другом.

Когда связь восстанавливается, Резерв сам возвращается в резервный режим (при внешнем управлении — по команде sync), останавливает сервисы и приводит копию к состоянию Основного. Данные Резерва за этот период на Основной не передаются:

  • изменённые на Резерве файлы и настройки перезаписываются версией Основного, созданные удаляются;
  • логи и значения виртуальных переменных заменяются данными Основного;
  • тренды и Журнал на Резерве становятся смешанными. Записи Резерва за этот период остаются, а записи Основного за тот же период на Резерв не приходят.

Тренды и Журнал после split brain нужно перекачать (см. «После split brain»). Последствия управляющих действий Резерва механизм не отслеживает.

Как снизить риск:

  • сделайте окно переключения больше времени перезагрузки Основного и перерывов в сети;
  • обеспечьте надёжный канал между серверами. Избегайте схем, где связь серверов друг с другом хуже, чем их связь с оборудованием и пользователями;
  • проводите плановые работы по процедуре «Плановые работы на Основном»;
  • после отказа Основного сервера закрепите Резерв в роли Основного (см. «После переключения»);
  • следите за состоянием Резерва по веб-интерфейсу клиента резервирования и логу backupclient;
  • если о переключении надёжнее может решать внешняя система (с арбитром, с возможностью гарантированно выключить Основной), используйте внешнее управление.

Внешнее управление переключением

Когда использовать
Включение
Файл команд
Файл состояния
Отличия от автоматического управления
Порядок переключения

По умолчанию backupclient сам решает, когда запускать сервисы Резерва: по пропаже связи с backupserver. Далее это называется автоматическим управлением. При внешнем управлении решение принимает внешняя система: скрипт, кластерный менеджер, система мониторинга или оператор. Она записывает команду в файл команд на Резерве, а backupclient сообщает о выполнении через файл состояния.

Когда использовать

Автоматическое управление не отличает отказ Основного от потери связи между серверами (см. «Split brain»). Внешнее управление нужно, когда о переключении можно судить надёжнее, чем по связи двух серверов друг с другом. Например:

  • есть третий узел (арбитр), который проверяет оба сервера;
  • внешняя система умеет гарантированно остановить Основной перед запуском Резерва: выключить питание, отключить от сети;
  • переключение должен подтверждать человек;
  • серверами уже управляет кластерный менеджер, и переключение системы должно быть частью его сценария.

Внешнее управление само по себе split brain не исключает. Если команда work придёт при работающем Основном, будут работать оба сервера. Не допускать этого должна внешняя система.

Включение

Параметры задаются в services/backupclient/config.cfg на Резерве:

Параметр По умолчанию Описание
external_control_enabled 0 1 — внешнее управление включено.
external_control_command_file ../../backupclient_command Файл команд. Путь задаётся так же, как backup_dir. По умолчанию — backupclient_command в каталоге установки.
external_control_status_file ../../backupclient_status Файл состояния. По умолчанию — backupclient_status в каталоге установки. Путь должен отличаться от пути файла команд, иначе файл состояния отключается.

Порядок включения:

  1. На Резерве: ./stop all.
  2. Запишите в файл команд sync: echo sync > /pult_server/backupclient_command.
  3. Задайте external_control_enabled=1, затем выполните ./start.
  4. Проверьте лог backupclient: external control enabled, пути файлов, external mode: sync, switch to sync mode. При запуске Основной обычно ещё не успевает ответить, поэтому строка выглядит как switch to sync mode (not authorized, no data); синхронизация начнётся после authorization: ok. Когда сервисы Резерва остановятся, в файле состояния появится sync.

Где размещать файлы:

  • Файл команд должен сохраняться при перезагрузке. Не кладите его в каталоги, которые очищаются при загрузке ОС, например /tmp или /run. При каждом запуске backupclient выполняет записанную в файле команду, а без команды удерживает сервисы Резерва остановленными.
  • Если файлы лежат в каталоге установки, backupclient исключает их из синхронизации: с Основного они не копируются и на Резерве не удаляются. Кладите их в корень каталога установки (как по умолчанию) или вне его. Каталоги, в которых лежат файлы, тоже исключаются из синхронизации, поэтому не размещайте файлы в каталогах системы, например в services/....

Файл команд

Файл содержит одно слово: sync или work. Регистр, пробелы и перевод строки не важны. backupclient читает файл при запуске, затем каждые 0,5 с и выполняет команду, когда содержимое файла изменилось.

Команда Действие
sync Резервный режим. backupclient сразу выставляет флаги reserve.tmp, ждёт остановки сервисов Резерва и открывает веб-интерфейс клиента резервирования. Синхронизация идёт, когда есть связь с Основным и он принял секрет.
work Рабочий режим. backupclient дожидается ответа на текущий запрос к Основному, прерывает проход синхронизации и снимает флаги reserve.tmp — сервисы Резерва запускаются. Связь с Основным при этом не проверяется.

Любое другое содержимое, а также пустой, отсутствующий или нечитаемый файл режим не меняют: в лог пишется mode … kept. Поэтому удаление файла команд ничего не запускает и не останавливает.

Если при запуске backupclient в файле нет команды, сервисы Резерва удерживаются до её появления. Синхронизация не идёт, в файле состояния — none. Когда сервисы Резерва остановятся, открывается веб-интерфейс клиента резервирования с надписью «Ожидание внешней команды». Команда sync начинает синхронизацию, страница при этом остаётся открытой. Команда work закрывает страницу и запускает сервисы.

Команда sync после рабочего режима приводит копию к Основному. Данные, накопленные Резервом в рабочем режиме, на Основной не передаются: последствия те же, что после split brain. Если эти данные нужны, не возвращайте Резерв командой sync, а закрепите его в роли Основного (см. «После переключения»).

Файл состояния

backupclient записывает в файл одно слово при каждой смене состояния. Запись атомарная: прочитать наполовину записанный файл нельзя.

Состояние Значение
none Команды ещё не было. Сервисы Резерва удерживаются, синхронизации нет, веб-интерфейс клиента резервирования открыт.
switching Переход по последней команде не закончен. Например, после sync ещё не остановились все сервисы Резерва.
sync Резервный режим: все сервисы Резерва, кроме supervisor и backupclient, остановлены. Основной можно запускать.
work Рабочий режим: флаги reserve.tmp сняты, сервисы Резерва запускаются.
stopped backupclient остановлен, в том числе для перезапуска. Флаги reserve.tmp сняты: сервисы Резерва могут работать.

Состояние sync ничего не говорит о связи с Основным и полноте копии: их показывают веб-интерфейс клиента резервирования и лог. Что сервисы Резерва в рабочем режиме действительно запустились, проверяйте по файлу services/server/running.tmp.

Если записать файл не удалось, backupclient пишет в лог error writing status file … и повторяет попытку.

Отличия от автоматического управления

  • Связь с Основным на режим не влияет. Пропажа backupserver не запускает сервисы Резерва, а его ответ не возвращает Резерв в резервный режим. Окна переключения нет: server_reconnect_attempts и server_reconnect_interval на переход не влияют.
  • Отказ Основного по секрету режим тоже не меняет: Резерв остаётся в заданном режиме, но без синхронизации.
  • Флаги reserve.tmp выставляются сразу при запуске backupclient, если в файле команд sync или команды нет. Сервисы Резерва не получают разрешения стартовать до ответа Основного, как при автоматическом управлении.
  • Остановка backupclient по-прежнему снимает флаги reserve.tmp, и сервисы Резерва запускаются. В файл состояния при этом пишется stopped.
  • Веб-интерфейс клиента резервирования открыт и до первой команды. Без связи с Основным он показывает «Нет связи. Ожидание внешней команды...» вместо обратного отсчёта, а в описании на странице сказано, что сервисы запустит внешняя команда.

Порядок переключения

Такой порядок не допускает одновременной работы серверов. Команды записываются в файл команд Резерва.

Переключение на Резерв:

  1. Остановите Основной: ./stop all на нём, выключение или отключение от сети. Если Основной недоступен, убедитесь, что он не вернётся сам.
  2. Запишите команду work.
  3. Дождитесь work в файле состояния.

При плановом переключении на шаге 1 сначала выполните на Основном ./stop -backupserver и дождитесь конца прохода (all tasks complete в логе backupclient): так на Резерв уйдут последние данные. Затем остановите и backupserver.

Возврат Резерва в резервный режим:

  1. Запишите команду sync.
  2. Дождитесь sync в файле состояния: сервисы Резерва остановлены.
  3. Запустите Основной: ./start.

Перед возвратом учтите, что данные Резерва за время работы будут потеряны (см. «Файл команд»).

Плановые работы на Основном. Резерв сам не переключается, поэтому останавливать его на время работ не нужно.


Требования к серверам и сети

Сеть

  • Одинаковые установки. На Основном и Резерве должны совпадать версия системы, архитектура процессора, ОС и путь установки. Исполняемые файлы копируются с Основного как есть: сборка под другую архитектуру на Резерве не запустится.
  • Настройки сервисов не должны зависеть от машины. Они копируются с Основного без изменений. Привязка к IP-адресам Основного, имена последовательных портов и устройств, абсолютные пути, которых нет на Резерве, — всё это перейдёт на Резерв.
  • Всё нужное лежит в каталоге установки. Каталог трендов, база Журнала, хранилища значений, ssl-файлы и цели символических ссылок вне source_dir на Резерв не попадут. Перенесите их внутрь каталога установки или поддерживайте на Резерве вручную по тем же путям.
  • Доступ к оборудованию. Резерву нужны те же сетевые маршруты и разрешения на контроллерах и шлюзах, что и Основному. Оборудование, подключённое к Основному физически (последовательные порты, USB), Резерв не получит.
  • Адрес для пользователей. Механизм не переносит IP-адрес и DNS-имя Основного. Заранее решите, как пользователи и внешние системы попадут на Резерв: DNS с коротким временем жизни записи, перенос адреса вручную или инструкция операторам. Для автоматического переноса адреса подходит keepalived (общий виртуальный IP по VRRP). Настройте его так, чтобы адрес следовал за реально работающим сервером. Например, проверочный скрипт может проверять наличие файла /pult_server/services/server/running.tmp — признака работающего сервиса server. При split brain адрес может оказаться на обоих серверах.
  • Место на диске. На Резерве нужен объём копии и запас под самый большой файл: он сначала качается во временный файл. На Основном в services/backupserver/temp нужно место под временные копии больших файлов и хранилищ значений.

Сеть

Направление Порт Зачем
Резерв → Основной TCP 11317 (настраивается), TLS синхронизация
пользователи → Резерв порты веб-интерфейса системы веб-интерфейс клиента резервирования; работа системы после переключения

Важно. Любая ошибка связи выглядит для Резерва как пропажа Основного и через окно переключения запускает систему на Резерве. Это относится к адресу, порту, межсетевому экрану, allowed_ip, несовпадению настроек TLS и непрошедшей проверке сертификата. При внешнем управлении ошибка связи только останавливает синхронизацию.


Что копируется на Резерв

Проход синхронизации
Данные
Что не копируется
Удаление на Резерве
Принудительная перекачка

Проход синхронизации

  1. Резерв сверяет время с Основным и подстраивает под него своё время и часовой пояс.
  2. Резерв получает от Основного список файлов и сравнивает его со своей копией. Изменённое он ставит в очередь, лишнее удаляет. В первом проходе после запуска backupclient сначала запрашиваются только настройки сервисов, чтобы веб-интерфейс клиента резервирования быстрее поднялся на нужных портах.
  3. Резерв скачивает данные в таком порядке: сначала настройки сервисов и ssl-файлы, затем остальное, затем каталог data, в самом конце — логи сервисов.

Ошибка с отдельным файлом не останавливает проход: файл повторится в следующем проходе. При обрыве связи проход прерывается; после переподключения следующий проход начинается заново.

Отставание. На Резерве есть только то, что успело передаться к моменту отказа. Каждый файл заменяется целиком и атомарно, поэтому недокачанных файлов на Резерве не бывает: остаётся предыдущая версия.

Нагрузка. В каждом проходе оба сервера читают и хэшируют все обычные файлы каталога установки, кроме трендов, Журнала и логов. При расписании по умолчанию это почти непрерывная работа. Если обычных файлов много и они большие, увеличьте backup_period. Цена — большее отставание Резерва.

Данные

Данные Как копируются
Тренды Инкрементально: докачиваются только новые записи. Удаление старых записей на Основном (глубина хранения) повторяется на Резерве.
Журнал (действия операторов, тревоги, сбои и т. п.) Инкрементально: передаются только новые записи. Старые записи, удалённые на Основном при очистке, удаляются и на Резерве.
Хранилища значений (kvdb): текущие значения виртуальных переменных, в том числе статусы тревожных переменных При изменении копируются целиком, согласованным снимком.
Логи сервисов Дописываются с конца. Если копия разошлась с Основным, лог перекачивается целиком.
Проекты, настройки, файлы системы и прочее При изменении копируются целиком. Права доступа и даты изменения сохраняются.

Что не копируется

Эти пути не передаются с Основного и не удаляются на Резерве. Список встроен в backupserver, кроме последнего пункта.

  • служебные файлы сервисов: time_correction.dat, services/*/running.tmp, services/*/reserve.tmp;
  • кэш и временные файлы сервиса server: services/server/cache, services/server/temp;
  • служебные данные supervisor: services/supervisor/errors, logs, lock;
  • настройки и логи самих backupclient и backupserver: config.cfg, config.default, logs, а у backupserver ещё и temp. Поэтому у Резерва остаются свои настройки резервирования;
  • временные и служебные файлы трендов, Журнала и хранилищ значений (их содержимое приходит описанными выше способами);
  • при внешнем управлении — файлы команд и состояния, если они лежат в каталоге установки, и всё, что начинается с их имени (например, временные .tmp). Их исключает сам backupclient.

Удаление на Резерве

Всё в каталоге установки Резерва, чего нет на Основном, удаляется, кроме исключений выше. Каждое удаление записывается в лог: delete <путь>.

  • Не храните в каталоге установки Резерва свои файлы: они будут удалены.
  • Не меняйте ничего в системе на Резерве в резервном режиме: изменения будут перезаписаны.
  • Если source_dir на Основном по ошибке указывает на другой существующий каталог, Резерв удалит свою копию и станет зеркалом этого каталога. Если source_dir не существует, ничего не удаляется.

Каталог нового сервиса, появившегося на Основном, получает на Резерве флаг reserve.tmp раньше, чем в него придут файлы. Поэтому новый сервис на Резерве не запустится.

Принудительная перекачка

В резервном режиме удалите копию на Резерве — следующий проход скачает её заново целиком. Базу Журнала удаляйте вместе с файлами -wal и -shm, если они есть.

Тренды и Журнал удаляйте, когда синхронизация по ним не идёт: если ответ придёт уже после удаления, новая копия начнётся не с начала. Чтобы проверить тренд, сравните после перекачки размер его файла на Резерве и на Основном: они должны совпасть.


Процедуры обслуживания и переключения

Плановые работы на Основном
Ручное переключение на Резерв
После переключения
Новая пара серверов
Возврат ролей
Проверка переключения
После split brain

Процедуры этого раздела написаны для автоматического управления. При внешнем управлении Резерв переключают командами work и sync (см. «Порядок переключения»). Закрепление Резерва (enabled=0 в services/backupclient/config.cfg) и действия после split brain нужны и при внешнем управлении.

Плановые работы на Основном

Если backupserver будет недоступен меньше окна переключения, ничего делать не нужно. Если дольше:

  1. На Резерве: ./stop all.
  2. Выполните работы на Основном.
  3. Убедитесь, что Основной работает и backupserver доступен с Резерва.
  4. На Резерве: ./start. В логе backupclient должны появиться authorization: ok и switch to sync mode.

Не останавливайте на Резерве только backupclient: при его остановке сервисы Резерва запускаются.

Ручное переключение на Резерв

Этот порядок нужен, когда backupserver отвечает, а система на Основном не работает, или когда переключение нужно сразу, без ожидания окна.

  1. Если данные на Основном ещё доступны, дождитесь конца прохода: в логе backupclient появится all tasks complete, синхронизация в веб-интерфейсе клиента — 100%.
  2. На Основном: ./stop all, либо выключите Основной или отключите его от сети. Он не должен вернуться сам, иначе возникнет split brain.
  3. На Резерве: ./stop all, затем enabled=0 в services/backupclient/config.cfg, затем ./start. Сервисы Резерва запустятся сразу и уже не вернутся в резервный режим.
  4. Дальше действуйте по разделу «После переключения», начиная с шага 1.

После переключения

Резерв в рабочем режиме: в логе backupclient есть switch to work mode.

  1. Направьте пользователей и внешние системы на Резерв.
  2. Закрепите Резерв. На Резерве выполните ./stop all, затем установите enabled=0 в services/backupclient/config.cfg, затем ./start. Сервисы перезапустятся за несколько секунд. Если этого не сделать, Резерв вернётся в резервный режим, как только по адресу server_host снова ответит backupserver (например, отремонтированный Основной включат в сеть). Тогда Резерв остановит сервисы и заменит данные, накопленные после переключения, устаревшими данными Основного. Если переключение выполнено вручную, этот шаг уже сделан.
  3. Не включайте старый Основной в сеть в прежней роли: его сервисы запустятся и будут работать одновременно с Резервом. Перед подключением отключите на нём backupserver и прикладные сервисы или подключайте его изолированно.
  4. Восстановите резервирование: бывший Резерв теперь Основной.

Новая пара серверов

  1. Новый Основной (бывший Резерв). Его настройки backupserver локальные, с Основного они не копировались. Задайте secret и enabled=1 в services/backupserver/config.cfg, затем выполните ./start. Сервис backupclient на нём должен быть выключен.
  2. Новый Резерв, например отремонтированный старый Основной. Установите систему той же версии. Выключите backupserver (enabled=0), настройте backupclient по разделу «Включение на Резерве». Каталог установки будет приведён к копии нового Основного, лишнее будет удалено.
  3. Выполните проверку из раздела «Быстрый старт».

Если новый Резерв раньше был Основным, до первого ответа нового Основного его сервисы backupclient-ом не удерживаются. Они могут запуститься со старыми данными: начать опрос оборудования, отправить оповещения. Подключайте машину к сети, когда backupclient уже настроен. При необходимости заранее выключите на ней прикладные сервисы: их актуальные настройки придут с Основного, когда сервисы уже будут в режиме ожидания.

Возврат ролей

Этот порядок нужен, если Основным снова должна стать прежняя машина, а сейчас она работает Резервом с полной синхронизацией.

  1. Убедитесь, что синхронизация завершена и ошибок нет: 100%, 0 ERR.
  2. На текущем Основном: ./stop -backupserver. Будут остановлены все сервисы, кроме backupserver. Дождитесь ещё одного полного прохода (all tasks complete в логе Резерва) — так на Резерв уйдут последние данные.
  3. На текущем Основном: ./stop all. Резерв перейдёт в рабочий режим через окно переключения. Можно не ждать и переключить его вручную (шаг 3 раздела «Ручное переключение на Резерв»).
  4. Дальше действуйте по разделам «После переключения» и «Новая пара серверов», поменяв машины ролями.

Проверка переключения

Убедиться, что Резерв поднимет систему, можно только проверкой. Проведите её в окно обслуживания:

  1. На Основном: ./stop all. Разрыва связи между серверами недостаточно: Основной продолжит работать, и возникнет split brain.
  2. Через окно переключения в логе Резерва появится switch to work mode, а страница «Сервер в резерве» сменится веб-интерфейсом системы. Проверьте опрос оборудования и оповещения.
  3. На Основном: ./start. Резерв сам вернётся в резервный режим.
  4. Данные, записанные Резервом во время проверки, на Основной не попадут. Выполните шаг 3 из раздела «После split brain».

После split brain

Признак split brain: в логе backupclient за switch to work mode следует switch to sync mode, хотя Основной всё это время работал.

  1. Устраните причину: связь, настройки или слишком короткое окно.
  2. Разберите, что делали оба сервера в этот период: команды на оборудование, оповещения, изменения, сделанные пользователями на Резерве. Изменения на Резерве потеряны.
  3. Перекачайте тренды и Журнал. В резервном режиме удалите на Резерве базу Журнала и файлы трендов, которые писались во время работы Резерва (проще удалить все тренды). Учитывайте предупреждение из раздела «Принудительная перекачка». Пока перекачка не закончится, истории трендов на Резерве не будет. Остальное Резерв выровняет сам.

Диагностика и устранение неполадок

Логи
Сообщения лога backupclient
Коды ошибок
Частые ситуации

Логи

Сервер Лог
Резерв services/backupclient/logs
Основной services/backupserver/logs

Логи этих сервисов пишутся по умолчанию и между серверами не копируются.

В логе backupserver после строки configs processed: перечислены правила вида - <тип> | <шаблон>. По ним видно, какие файлы копируются как тренды (trend), Журнал (journal), хранилища значений (kvdb) и логи (log), что исключено (noop) и какие ssl-файлы идут первыми (first). Если нужного пути там нет, скорее всего, он лежит вне source_dir. Изменения настроек других сервисов backupserver отслеживает сам, раз в секунду.

Сообщения лога backupclient

Сообщение Значение
authorization: ok Основной принял секрет
authorization rejected: … - check server_secret; no sync until restart неверный секрет: резервный режим, синхронизации нет
error authorization: …, retry in 30 s авторизация не прошла не из-за секрета, повтор через 30 с
switch to sync mode переход в резервный режим
switch to sync mode (not authorized, no data) переход в резервный режим без синхронизации: Основной отказал по секрету. При внешнем управлении — также если Основной ещё не ответил на авторизацию (обычно при запуске backupclient); синхронизация начнётся после authorization: ok
switch to work mode Резерв запустил сервисы
external control enabled / external control disabled внешнее управление включено / выключено. При включении следом идут пути файлов: - command file: …, - status file: …
external mode: work / external mode: sync принята команда из файла команд
external command file: missing or unreadable, mode … kept файла команд нет или он не читается; режим не меняется
external command file: no 'work' or 'sync' command, mode … kept в файле команд не work и не sync; режим не меняется
no external command: reserve services blocked until 'work' or 'sync' при запуске команды нет: сервисы Резерва удерживаются до команды; после их остановки откроется веб-интерфейс клиента резервирования
external control error: same control and status files! пути файлов команд и состояния совпадают, файл состояния отключён
error writing status file <путь>: <ошибка> файл состояния не записан, повтор при следующей проверке
open web-interface on http port N / https port N открыт веб-интерфейс клиента резервирования
connection lost: N queued tasks dropped обрыв связи посреди прохода
N queued tasks dropped внешнее управление: проход прерван обрывом связи или командой work
configs list loaded: … получен предварительный список настроек
list loaded: N items, extra N deleted, N updated, N updates in task (~N bytes) получен полный список: сколько удалено лишнего, обновлено сразу, поставлено в очередь, ориентировочный объём закачки
delete <путь> удалён файл, которого нет на Основном
upadted: <путь> обновлён файл (текст сообщения — как в логе)
updated: <путь> (+N records) докачаны новые записи тренда или Журнала
updated: <путь> (+N records, M old removed) Журнал: добавлено N записей, удалено M старых, удалённых на Основном
updated: <путь> (+N bytes) / reloaded: <путь> (N bytes) лог дописан / перекачан целиком
log <путь> differs from server, reloading лог на Резерве разошёлся с Основным, начата полная перекачка
journal <путь>: last ids did not advance, stopped синхронизация Журнала остановлена из-за неожиданного состояния базы
executable <путь> updated (… -> … bytes), restart исполняемый файл обновлён, backupclient перезапустится в конце прохода
exit for restart with updated executable backupclient завершается для перезапуска новой версией
self-update check disabled: … проверка обновления исполняемого файла отключена; после обновления перезапустите backupclient вручную
time sync correction: X ±Y ms сверка времени с Основным
error updating <путь>: <ошибка> файл не обновлён, повтор в следующем проходе
error load list: … список не получен, ничего не удалено
all tasks complete проход закончен

Коды ошибок

Ошибки по отдельным файлам повторяются в следующем проходе сами. Если ошибка держится, ищите причину по таблице. Помимо кодов, в сообщениях бывают системные ошибки: нет места, нет прав и т. п.

Код Значение Что делать
5300 Файл удалён на Основном между списком и запросом Ничего: файл исчезнет с Резерва в следующем проходе
5301, 5302 Файл изменился во время чтения Ничего, повторится
5303 Тренд занят очисткой Ничего, повторится
5304, 5305 Ошибка чтения тренда на Основном При повторении проверьте файл тренда на Основном
5306 Неверный секрет Сверьте server_secret на Резерве и secret на Основном
5307 source_dir не существует Проверьте source_dir на Основном
5308, 5309 Запрос до авторизации или в первую секунду после запуска backupserver Ничего, повторится
5310, 5311, 5315 Ошибка чтения базы Журнала на Основном, в том числе база занята При повторении проверьте базу на Основном
5312 Прервана закачка большого файла (пауза больше 60 с, перезапуск backupserver) Ничего, повторится
5313 Хранилище значений заблокировано или ещё не создано При повторении проверьте сервис-владелец на Основном
5314 Не удалось создать временную копию на Основном Проверьте место на диске Основного (services/backupserver/temp)
5316 Слишком много неверных секретов с этого адреса Исправьте секрет и подождите
5321, 5322, 5325 Ошибка записи файла, тренда или лога на Резерве Проверьте место на диске и права на Резерве
5323 Ошибка записи Журнала на Резерве (текст ошибки — в сообщении) Проверьте место на диске; при повреждении базы удалите её на Резерве для перекачки
5324 Хранилище значений скачано не полностью Ничего, повторится
5326 Лог изменился во время передачи Ничего, повторится
5327 backupserver на Основном старой версии Обновите систему на Основном

Частые ситуации

Симптом Причина Что делать
«Клиент не авторизован!», в логе authorization rejected Секреты не совпадают Задайте server_secret равным secret Основного
Резерв перешёл в рабочий режим при работающем Основном Связь, межсетевой экран, адрес или порт, allowed_ip, несовпадение TLS, проверка сертификата, backupserver выключен; либо окно короче перерыва связи Устраните причину. Резерв сам вернётся в резервный режим, затем выполните «После split brain»
Страница «Сервер в резерве» не открывается, в логе нет open web-interface Какой-то сервис Резерва не остановился, или ещё не пришли настройки сервиса server Найдите работающие сервисы: ls /pult_server/services/*/running.tmp
Счётчик ошибок больше нуля Ошибки в проходе Найдите error updating в логе backupclient и сверьтесь с таблицей кодов
Нужный файл не попадает на Резерв Файл вне source_dir или в списке исключений Проверьте список после configs processed: в логе backupserver
На Резерве пропадают файлы Резерв зеркалирует Основной Найдите строки delete в логе; не храните на Резерве своих файлов
Тренды или Журнал на Резерве отличаются от Основного Был split brain или проверка переключения Выполните «После split brain»
Резерв не переключился, хотя Основной пропал Включено внешнее управление: переключает только команда work Проверьте внешнюю систему и файл команд
Внешнее управление: команда записана, но режим не меняется, или сервисы Резерва стоят с none в файле состояния и «Ожиданием внешней команды» на странице Команда записана не в тот файл или в файле не work/sync (в логе mode … kept) Сверьте путь в логе backupclient (- command file: …) и содержимое файла
Внешнее управление: после sync в файле состояния долго switching Какой-то сервис Резерва не останавливается Найдите работающие сервисы: ls /pult_server/services/*/running.tmp
Внешнее управление: файл состояния не обновляется Нет прав на запись или каталога, либо пути файлов команд и состояния совпадают Найдите в логе error writing status file или same control and status files
   fdb_list
   fdb_load
   fdb_move
   fdb_paths
   node_list
   subscribe
   user_list
   user_save
   var_get
   var_list
   var_set